// node 25_树状结构转平铺属性结构.js

//Object.entries()  返回一个给定对象自身可枚举属性的键值对数组  

const entry = {
    a:{
        b:{
            c:{
                dd:'abcdd'
            },
        },
        d:{
            ee:'adee'
        },
        f:'af'
    },
}

//目标结果：
// { 
//   'a.b.c.dd': 'abcdd', 
//   'a.d.ee': 'adee', 
//   'a.f': 'af' 
//  }

//方法1：递归
//每次处理一层结构，通过判断属性的值是否是对象来确定递归是否结束
//-如果是对象，表示没有结束，递归调用
//-如果不是对象，表示到递归的最后一层，确定属性值
function operateEntry(obj,proKey='',res={}) {//(原对象，上一轮的key,最终结果)
    for(let key in obj){//遍历当前一层的元素
        if(typeof obj[key] === 'object'){//如果是对象，则继续往内部递归
            operateEntry(obj[key],`${proKey}${key}.`,res)
        }else{
            res[proKey+''+key] = obj[key]//如果不是对象，则合成结果并储层
        }
    }
    return res
}
console.log(operateEntry(entry))

//方法2：while循环-队列
//使用Object.entries()方法，处理原始对象
//使用队列存储每一层的值，直到队列中的值处理完毕
function operateEntry2(obj) {
    let arr = Object.entries(obj)
    console.log(arr)
    let res = {}
    while(arr.length){
        let [key,value] = arr.pop()
        for(let [k,v] of Object.entries(value)){
            if(typeof v === 'object'){
                arr.push([`${key}.${k}`,v])
            }else{
                res[`${key}.${k}`] = v
            }
        }
    }
    return res
}
console.log(operateEntry2(entry))